package com.thp.proxy.cglib;

/**
 * 
 * 代理模式的三个必要条件:
 * 1.执行者,被代理人
 * 2.对于被代理人来说,这件事情是一定要做的,但是我自己又不想做或者没有时间去做,找代理
 * 3.需要获取被代理的人的个人资料
 * @author Tommy
 *
 */


public class TestCglibProxy {

	
	public static void main(String[] args) {
		// jdk的动态代理是通过接口来进行强制转换的
		// 生成以后的代理对象,可以强制转换为接口
		
		// cglib的动态代理是通过生成一个被代理对象的主类
		// 然后重写父类的方法
		// 生成以后的对象时可以强制转换为被代理对象(也就是用户自己写的类)
		// 子类引用赋值给父类
		
		
		
		try {
			Person obj = (Person) new Witchcraft().getInstance(Person.class);
			System.out.println(obj.getClass());
			
			obj.haveDinner();  // 调用这个 代理对象的方法  就会调用Wichcraft(代理类)的intercept方法
			// 所以代理类中不能再次调用invoke()方法,因为这样又会调用自己  陷入死循环
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	
}
